#Copyright (c) 2012-8 Civa Lin. All rights reserved.
"""
Parse Utility 文字分析工具模組

本模組提供字串工具，處理某些特殊的純文字。

本模組的變數命名方式：
    filename 表示完整檔案路徑
    dir 或 dirname 表示路徑
    base 表示主檔名
    ext 表示副檔名（含.）
    baseext 表示 base + ext
"""

import re

class NotMatch(Exception): pass

_body = re.compile(r'<\s*?body.*?>(.*?)<\s*?/\s*?body\s*?>',
        flags = re.DOTALL) # 記得匹配換行符
_body_fuzzy = re.compile(r'<\s*?body.*?>(.*)',
        flags = re.DOTALL) # 將開始標籤後的內容全部取出

def html2content(html):
    '''將 html 去頭去尾，只留下 body 內側的部份

        如果無法找到完整的 body 元素，則儘可能不錯失地切割出 body
        無法找到切割點的情況下，會直接傳回原值。
        '''
    try:
        return _body.search(html).group(1)
    except:
        try:
            return _body_fuzzy.search(html).group(1)
        except:
            return html

_newline = re.compile(r'\n+')
_need_newline = re.compile( # 都是end標籤，包括p br h1~6 li
    r'(<\s*?/\s*?li\s*?>|<\s*?/\s*?p\s*?>|<\s*?br\s*?/\s*?>|<\s*?/\s*?h[1-6]\s*?>)')
_tag = re.compile(r'<[^>]*>')

def html2txt(html):
    '''將 html 內文去掉標籤並轉為純文字

        html   = 含有 html 內容的字串
        return ==> 純文字字串
        '''
    new = html2content(html) # 擷取 body 部份，其他拋棄
    new = _newline.sub(r'', new) # 先剃掉所有現有的換行符號
    new = _need_newline.sub(r'\1\n\n', new)# 在某些標籤尾端補上換行符號
    new = _tag.sub(r'', new)  # 剃掉所有 html 標籤
    return new

